package com.example.service;

import com.example.common.Result;
import com.example.common.PageResult;
import com.example.entity.UserBalance;
import com.example.vo.UserBalanceVO;

import java.math.BigDecimal;
import java.util.List;

public interface UserBalanceService {
    
    /**
     * 根据用户ID获取用户余额信息
     */
    Result<UserBalanceVO> getUserBalance(Long userId);

    /**
     * 获取当前用户余额信息
     */
    Result<UserBalanceVO> getMyBalance();
    
    /**
     * 初始化用户余额记录
     */
    Result<Void> initUserBalance(Long userId);
    
    /**
     * 增加用户余额
     */
    Result<Void> addBalance(Long userId, BigDecimal amount, String remark);
    
    /**
     * 扣减用户余额
     */
    Result<Void> subtractBalance(Long userId, BigDecimal amount, String remark);
    
    /**
     * 冻结用户余额
     */
    Result<Void> freezeBalance(Long userId, BigDecimal amount, String remark);
    
    /**
     * 解冻用户余额
     */
    Result<Void> unfreezeBalance(Long userId, BigDecimal amount, String remark);
    
    /**
     * 检查用户余额是否充足
     */
    Result<Boolean> checkBalance(Long userId, BigDecimal amount);

    /**
     * 检查用户余额是否充足（通过字符串金额）
     */
    Result<Boolean> checkBalanceByAmount(Long userId, String amount);
    
    /**
     * 获取所有用户余额列表
     */
    Result<List<UserBalanceVO>> getAllUserBalances();
    
    /**
     * 分页查询用户余额
     */
    Result<PageResult<UserBalanceVO>> getUserBalancePage(int page, int size, String keyword);
    
    /**
     * 更新用户余额和累计充值金额（充值时使用）
     */
    Result<Void> updateBalanceAndTotalRecharge(Long userId, BigDecimal rechargeAmount);
    
    /**
     * 更新用户余额和累计消费金额（消费时使用）
     */
    Result<Void> updateBalanceAndTotalConsume(Long userId, BigDecimal consumeAmount);
    
    /**
     * 根据累计充值金额更新用户会员等级
     */
    Result<Void> updateMemberLevel(Long userId, BigDecimal totalRecharge);
}
